mwan3: remove pgrep usage
authorEtienne Champetier <[email protected]>
Fri, 27 Jun 2025 23:18:49 +0000 (19:18 -0400)
committerFlorian Eckert <[email protected]>
Fri, 1 Aug 2025 11:03:01 +0000 (13:03 +0200)
pgrep is pretty slow as it needs to read all /proc/*/cmdline
or /proc/*/status, and it's called twice per wan.
Add STARTED and PID files to speedup mwan3_get_mwan3track_status().

Signed-off-by: Etienne Champetier <[email protected]>
net/mwan3/files/lib/mwan3/common.sh
net/mwan3/files/usr/sbin/mwan3track

index 953cd6665e09c4b4de04beb8e63e117e12dbc9f5..d3597aaf8ccc900c9b5d568b57a0e44e08bc0679 100644 (file)
@@ -94,28 +94,40 @@ readfile() {
 
 mwan3_get_mwan3track_status()
 {
-       local track_ips pid
+       local interface=$1
+       local track_ips pid cmdline started
        mwan3_list_track_ips()
        {
                track_ips="$1 $track_ips"
        }
-       config_list_foreach "$1" track_ip mwan3_list_track_ips
-
-       if [ -n "$track_ips" ]; then
-               pid="$(pgrep -f "mwan3track $1$")"
-               if [ -n "$pid" ]; then
-                       if [ "$(cat /proc/"$(pgrep -P $pid)"/cmdline)" = "sleep${MAX_SLEEP}" ]; then
-                               tracking="paused"
-                       else
-                               tracking="active"
-                       fi
-               else
-                       tracking="down"
-               fi
-       else
-               tracking="disabled"
+       config_list_foreach "$interface" track_ip mwan3_list_track_ips
+
+       if [ -z "$track_ips" ]; then
+               echo "disabled"
+               return
+       fi
+       readfile pid $MWAN3TRACK_STATUS_DIR/$interface/PID 2>/dev/null
+       if [ -z "$pid" ]; then
+               echo "down"
+               return
+       fi
+       readfile cmdline /proc/$pid/cmdline 2>/dev/null
+       if [ $cmdline != "/bin/sh/usr/sbin/mwan3track${interface}" ]; then
+               echo "down"
+               return
        fi
-       echo "$tracking"
+       readfile started $MWAN3TRACK_STATUS_DIR/$interface/STARTED
+       case "$started" in
+               0)
+                       echo "paused"
+                       ;;
+               1)
+                       echo "active"
+                       ;;
+               *)
+                       echo "down"
+                       ;;
+       esac
 }
 
 mwan3_init()
index 340d792775b7630a332f62f9c1da60174ebc9387..e30ad5fedda19f5f293edf02aaecfe1a90526d85 100755 (executable)
@@ -36,7 +36,7 @@ if_up() {
        LOG info "Detect ifup event on interface ${INTERFACE} (${DEVICE})"
        IFDOWN_EVENT=0
        IFUP_EVENT=1
-       STARTED=1
+       started
        stop_subprocs
 }
 
@@ -164,7 +164,7 @@ connecting() {
 disabled() {
        STATUS='disabled'
        echo "disabled" > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STATUS
-       STARTED=0
+       stopped
 }
 
 firstconnect() {
@@ -187,7 +187,7 @@ firstconnect() {
 
        LOG debug "firstconnect: called on $INTERFACE/$true_iface ($DEVICE). Status is $STATUS. SRC_IP is $SRC_IP"
 
-       STARTED=1
+       started
        if [ "$STATUS" = "offline" ]; then
                disconnected 1
        else
@@ -195,6 +195,16 @@ firstconnect() {
        fi
 }
 
+stopped() {
+       STARTED=0
+       echo 0 > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STARTED
+}
+
+started() {
+       STARTED=1
+       echo 1 > $MWAN3TRACK_STATUS_DIR/$INTERFACE/STARTED
+}
+
 update_status() {
        local track_ip=$1
 
@@ -214,13 +224,13 @@ main() {
 
        INTERFACE=$1
        STATUS=""
-       STARTED=0
+       mkdir -p $MWAN3TRACK_STATUS_DIR/$INTERFACE
+       echo $$ > $MWAN3TRACK_STATUS_DIR/$INTERFACE/PID
+       stopped
        TRACK_OUTPUT=$MWAN3TRACK_STATUS_DIR/$INTERFACE/TRACK_OUTPUT
 
        mwan3_init
 
-       mkdir -p $MWAN3TRACK_STATUS_DIR/$INTERFACE
-
        trap clean_up TERM
        trap if_down USR1
        trap if_up USR2